package org.holoeverywhere.addon; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.widget.DrawerLayout.DrawerListener; import android.support.v4.widget.DrawerLayout.LayoutParams; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.view.Window; import org.holoeverywhere.addon.IAddon.Addon; import org.holoeverywhere.slider.R; import org.holoeverywhere.slider.SliderMenu; import org.holoeverywhere.widget.DrawerLayout; @Addon(weight = 40) public class AddonSlider extends IAddon { public AddonSlider() { registerActivity(AddonSliderA.class); } public static class AddonSliderA extends IAddonActivity { private boolean mAddonEnabled = true; private DrawerLayout mDrawerLayout; private Context mMenuContext; private int mMenuLayout; private boolean mOverlayActionBar = false; private SliderMenu mSliderMenu; private void attach(View view, int gravity) { if (view == null) { return; } final ViewGroup.LayoutParams initialParams = view.getLayoutParams(); DrawerLayout.LayoutParams params; if (initialParams instanceof DrawerLayout.LayoutParams) { params = (LayoutParams) initialParams; } else if (initialParams != null) { params = new LayoutParams(initialParams); } else { params = new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT); } params.gravity = gravity; view.setLayoutParams(params); ViewParent parent = view.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(view); } requestDrawerLayout(); mDrawerLayout.addView(view, gravity == Gravity.NO_GRAVITY ? 0 : -1, params); } public void closeDrawer(int gravity) { requestDrawerLayout().closeDrawer(gravity); } public void closeDrawer(View drawerView) { requestDrawerLayout().closeDrawer(drawerView); } public void closeDrawers() { requestDrawerLayout().closeDrawers(); } public void closeLeftView() { closeView(getLeftView()); } public void closeRightView() { closeView(getRightView()); } private void closeView(View view) { if (view != null && requestDrawerLayout().isDrawerOpen(view)) { closeDrawer(view); } } @Override public View findViewById(int id) { return mDrawerLayout != null ? mDrawerLayout.findViewById(id) : null; } public View getContentView() { return get().findViewById(R.id.contentView); } @SuppressLint("InlinedApi") public void setContentView(View view) { attach(view, Gravity.NO_GRAVITY); } public DrawerLayout getDrawerLayout() { return mDrawerLayout; } public void setDrawerLayout(DrawerLayout drawerLayout) { mDrawerLayout = drawerLayout; if (mDrawerLayout != null) { mDrawerLayout.setId(R.id.slider); } } public void setDrawerLayout(int layoutResource) { final View view = get().getThemedLayoutInflater().inflate(layoutResource, null, false); if (view instanceof DrawerLayout) { setDrawerLayout((DrawerLayout) view); } else { get().setContentView(view); setAddonEnabled(false); } } public int getDrawerLockMode(int edgeGravity) { return requestDrawerLayout().getDrawerLockMode(edgeGravity); } public int getDrawerLockMode(View drawerView) { return requestDrawerLayout().getDrawerLockMode(drawerView); } public View getLeftView() { return get().findViewById(R.id.leftView); } @SuppressLint("InlinedApi") public void setLeftView(View view) { attach(view, Gravity.START); } public Context getMenuContext() { return mMenuContext; } public void setMenuContext(Context context) { mMenuContext = context; } public int getMenuLayout() { return mMenuLayout; } public View getRightView() { return get().findViewById(R.id.rightView); } @SuppressLint("InlinedApi") public void setRightView(View view) { attach(view, Gravity.END); } public boolean isAddonEnabled() { return mAddonEnabled; } public void setAddonEnabled(boolean addonEnabled) { mAddonEnabled = addonEnabled; } public boolean isDrawerOpen(int drawerGravity) { return requestDrawerLayout().isDrawerOpen(drawerGravity); } public boolean isDrawerOpen(View drawer) { return requestDrawerLayout().isDrawerOpen(drawer); } public boolean isDrawerVisible(int drawerGravity) { return requestDrawerLayout().isDrawerVisible(drawerGravity); } public boolean isDrawerVisible(View drawer) { return requestDrawerLayout().isDrawerVisible(drawer); } public boolean isOverlayActionBar() { return mOverlayActionBar; } public void setOverlayActionBar(boolean overlayActionBar) { mOverlayActionBar = overlayActionBar; } public SliderMenu obtainDefaultSliderMenu() { return obtainDefaultSliderMenu(0); } public SliderMenu obtainDefaultSliderMenu(int menuLayout) { if (mSliderMenu != null) { return mSliderMenu; } mMenuLayout = menuLayout; mSliderMenu = new SliderMenu(this); mSliderMenu.setHandleHomeKey(true); final Context menuContext = obtainMenuContext(mSliderMenu); setDrawerLayout(R.layout.slider_default_layout); setOverlayActionBar(true); mSliderMenu.makeDefaultMenu(menuContext); return mSliderMenu; } public Context obtainMenuContext(SliderMenu sliderMenu) { if (mMenuContext != null) { return mMenuContext; } return mMenuContext = sliderMenu.obtainMenuContext(get()); } public SliderMenu obtainSliderMenu() { if (mSliderMenu == null) { mSliderMenu = new SliderMenu(this); } return mSliderMenu; } @Override public boolean onNavigateUp() { if (mSliderMenu != null) { return mSliderMenu.onNavigateUp(); } return super.onNavigateUp(); } @SuppressLint("NewApi") @Override public void onPostCreate(Bundle savedInstanceState) { if (mSliderMenu != null) { mSliderMenu.onPostCreate(savedInstanceState); } if (!mAddonEnabled) { return; } requestDrawerLayout(); final View contentView = get().findViewById(R.id.contentView); if (contentView == null) { throw new IllegalStateException( "You should specify your content view by @id/contentView"); } final View leftView = get().findViewById(R.id.leftView), rightView = get() .findViewById(R.id.rightView); mDrawerLayout.removeAllViewsInLayout(); if (mOverlayActionBar) { mDrawerLayout.setFitsSystemWindows(true); get().setContentView(contentView); ViewGroup decorView = (ViewGroup) get().getWindow().getDecorView(); View view = decorView.getChildAt(0); decorView.removeView(view); setContentView(view); decorView.addView(mDrawerLayout, 0); } else { get().setContentView(mDrawerLayout); setContentView(contentView); } setLeftView(leftView); setRightView(rightView); } @Override public void onResume() { if (mSliderMenu != null) { mSliderMenu.onResume(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mSliderMenu != null) { mSliderMenu.onSaveInstanceState(outState); } } public void openContentView() { closeDrawers(); } public void openContentViewDelayed(int delay) { handler().postDelayed(new Runnable() { @Override public void run() { openContentView(); } }, delay); } public void openDrawer(int gravity) { requestDrawerLayout().openDrawer(gravity); } public void openDrawer(View drawerView) { requestDrawerLayout().openDrawer(drawerView); } public void openLeftView() { openView(getLeftView()); } public void openRightView() { openView(getRightView()); } private void openView(View view) { if (view != null && !requestDrawerLayout().isDrawerOpen(view)) { openDrawer(view); } } private DrawerLayout requestDrawerLayout() { if (mDrawerLayout == null && mAddonEnabled) { setDrawerLayout(R.layout.slider_default_layout); } return mDrawerLayout; } @Override public boolean requestWindowFeature(int featureId) { if (Window.FEATURE_ACTION_BAR_OVERLAY == featureId) { setOverlayActionBar(true); } return super.requestWindowFeature(featureId); } public void setDrawerListener(DrawerListener listener) { requestDrawerLayout().setDrawerListener(listener); } public void setDrawerLockMode(int lockMode) { requestDrawerLayout().setDrawerLockMode(lockMode); } public void setDrawerLockMode(int lockMode, int edgeGravity) { requestDrawerLayout().setDrawerLockMode(lockMode, edgeGravity); } public void setDrawerLockMode(int lockMode, View drawerView) { requestDrawerLayout().setDrawerLockMode(lockMode, drawerView); } public void setDrawerShadow(Drawable shadowDrawable, int gravity) { requestDrawerLayout().setDrawerShadow(shadowDrawable, gravity); } public void setDrawerShadow(int resId, int gravity) { requestDrawerLayout().setDrawerShadow(resId, gravity); } public void setScrimColor(int color) { requestDrawerLayout().setScrimColor(color); } public void toggle() { View view = getLeftView(); if (view == null) { view = getRightView(); } if (view == null) { return; } if (requestDrawerLayout().isDrawerOpen(view)) { openContentView(); } else { openView(view); } } } }